package com.sakura.singleton.type04;

/**
 * //TODO 懒汉式(同步方法)
 *
 *  //TODO 1) 解决了线程不安全问题
 *  //TODO 2) 效率太低了，每个线程在想获得类的实例时候，执行getInstance()方法都要进行
 *              同步。而其实这个方法只执行一次实例化代码就够了，后面的想获得该类实例，
 *              直接return就行了。方法进行同步效率太低
 *  //TODO 3) 结论：在实际开发中，不推荐使用这种方式
 *
 * @Author Sakura
 * @Date 2022/11/9 16:17
 * @Version 1.0
 */
public class SingletonTest04 {
    public static void main(String[] args) {
        System.out.println("懒汉式(静态变量)， 线程不安全~");
        Singleton instance = Singleton.getInstance();
        Singleton instance2 = Singleton.getInstance();
        System.out.println(instance == instance2); // true
        System.out.println("instance.hashCode=" + instance.hashCode());
        System.out.println("instance2.hashCode=" + instance2.hashCode());
    }
}
class Singleton {
    private static Singleton instance;

    private Singleton() {}

    /**
     *  TODO 方法上加了 synchronized 关键字;此时保证了线程安全，但是又引入了新的问题;就是效率太低
     *        因为,getInstance()方法可能被多个线程调用，每个线程在想获得类的实例时候，执行getInstance()方法都要进行同步
     *
     * @return
     */
    //即懒汉式
    public static synchronized Singleton getInstance() {
        if(instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}